package com.cqgc.controller;

import com.cqgc.pojo.dto.DeliveryDTO.*;
import com.cqgc.pojo.dto.OrderDTO.OrderStatusDTO;
import com.cqgc.pojo.entity.Delivery;
import com.cqgc.pojo.entity.PageResult;
import com.cqgc.pojo.entity.Result;
import com.cqgc.service.DeliveryService;
import com.cqgc.service.OrderService;
import com.cqgc.utils.ThreadLocalUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotEmpty;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @author : 是你
 * @time : 2024/4/24 16:27
 */
@RestController
@RequestMapping("/delivery")
@Api(tags = "配送接口")
public class DeliveryController {

    @Autowired
    private DeliveryService deliveryService;

    @Autowired
    private OrderService orderService;

    @GetMapping("/page")
    @ApiOperation("分页查询")
    public Result<PageResult> page(DeliveryPageDTO deliveryPageDTO) {
        PageResult pageResult = deliveryService.page(deliveryPageDTO);
        if (pageResult!=null) {
            return Result.success(pageResult);
        }
        return Result.error();
    }


    /**
     * 派单操作
     *
     * @param addDeliveryDTO 包含派单信息的数据传输对象，经过验证确保数据的合法性。
     * @return 返回操作结果，成功则返回派单成功消息，失败则返回派单失败消息。
     */
    @GetMapping("/add")
    @ApiOperation("派单")
    @RequiresRoles(value = {"supplier","admin"},logical = Logical.OR)
    public Result add(@Validated AddDeliveryDTO addDeliveryDTO) {
        // 调用服务层方法，尝试添加派单信息
        int rows = deliveryService.add(addDeliveryDTO);
        // 根据添加结果返回成功或失败的消息
        if (rows != 0) {
            OrderStatusDTO orderStatusDTO = new OrderStatusDTO();
            orderStatusDTO.setOrderNumber(addDeliveryDTO.getOrderNumber());
            orderStatusDTO.setStatus(4);
            orderService.updateStatus(orderStatusDTO);
            return Result.success("派单成功");
        }
        return Result.error("派单失败");
    }

    /**
     * 查询配送列表
     * 该接口不需要参数，通过GET请求访问/list路径来获取配送列表信息。
     * 返回值为一个Result对象，其中包含一个List<Delivery>类型的配送信息列表。
     * 如果查询成功，Result对象的状态为成功（success），并包含配送列表；
     * 如果查询失败，Result对象的状态为错误（error），并提供错误信息。
     * @return Result<List<Delivery>> 返回查询结果，包含配送信息列表或错误信息。
     */
    @GetMapping("/list")
    @ApiOperation("查询配送列表")
    @RequiresRoles(value = {"supplier","delivery","admin"},logical = Logical.OR)
    public Result<List<Delivery>> list() {
        // 调用deliveryService的list方法获取配送列表
        List<Delivery> list = deliveryService.list();
        if (list!=null) {
            // 查询成功，返回配送列表
            return Result.success(list);
        }
        // 查询失败，返回错误信息
        return Result.error("查询失败");
    }

    @PutMapping
    @ApiOperation("修改配送信息")
    @RequiresRoles(value = {"supplier","admin"},logical = Logical.OR)
    public Result update(@RequestBody @Validated UpdateDeliveryDTO updateDeliveryDTO) {
        Delivery delivery = new Delivery();
        BeanUtils.copyProperties(updateDeliveryDTO, delivery);
        Map<String,Object> map = ThreadLocalUtil.get();

        delivery.setUpdateTime(LocalDateTime.now());
        delivery.setUpdateUser((String) map.get("account"));
        int rows = deliveryService.update(delivery);
        if (rows != 0) {
            return Result.success("修改成功");
        }
        return Result.error("修改失败");
    }

    @DeleteMapping
    @ApiOperation("删除配送")
    @RequiresRoles(value = {"supplier","admin"},logical = Logical.OR)
    public Result delete(@Validated DeleteDeliveryDTO deleteDeliveryDTO) {
        int rows = deliveryService.delete(deleteDeliveryDTO);
        if (rows != 0) {
            return Result.success("删除成功");
        }
        return Result.error("删除失败");
    }

    @GetMapping("/updateStatus")
    @ApiOperation("修改配送状态")
    @RequiresRoles(value = {"supplier","admin","delivery"},logical = Logical.OR)
    public Result updateStatus(UpdateDeliveryStatusDTO statusDTO) {
        int rows = deliveryService.updateStatus(statusDTO);
        if (rows != 0) {
            return Result.success("修改成功");
        }
        return Result.error("修改失败");
    }

    @PostMapping("/like")
    @ApiOperation("模糊查询")
    public Result<PageResult> like(@RequestBody @Validated DeliveryLikeDTO deliveryLikeDTO) {
        PageResult pageResult = deliveryService.like(deliveryLikeDTO);
        if (pageResult!=null) {
            return Result.success(pageResult);
        }
        return Result.error();
    }
}
